home *** CD-ROM | disk | FTP | other *** search
/ Network Support Library / RoseWare - Network Support Library.iso / apidev / mhs_c.arc / INPOST.ARC / COMMANDS.C < prev    next >
C/C++ Source or Header  |  1988-06-27  |  4KB  |  172 lines

  1. /* ****************************** COMMANDS.C ****************************** */
  2. #include "cctypes.h"
  3. #define FIRST_WORD_SIZE 37
  4.  
  5. extern char Out[];
  6. extern char currentLine[];
  7. extern int ErrorsInThisFile;
  8. extern int warningFound;
  9.  
  10. extern int lineNumber;
  11. extern int InFile;
  12. extern MCB MCBStruct;
  13. extern char messageBuffer[];
  14. extern char workArea[];
  15. extern void AddCurrentLineToMessageBuffer();
  16. extern int GetNextLine();
  17. extern void GetFirstWord();
  18.  
  19. void WriteAttachmentFile();
  20.  
  21. int CreateMCBLine(type)
  22. int type;
  23. {
  24.     int returnCode = NO_ERROR, ccode = 0, bytes;
  25.     char fileName[81], temp[60], *p;
  26.     char firstWord[FIRST_WORD_SIZE];
  27.  
  28.     static int inMessage = 0;
  29.     static int inTextItem = 0;
  30.     static int hasAttachment = 0;
  31.     extern void InitMCB();
  32.  
  33.     Out[0] = '\0';
  34.     warningFound = 0;
  35.  
  36.     switch ( type ) {
  37.  
  38.     case MESSAGE:
  39.         if ( inMessage ) {
  40.             WriteMCBFile();
  41.             /* STUB call seal from here */
  42.             InitMCB();
  43.         }
  44.         inMessage++;
  45.         break;
  46.     case FROM:
  47.         /* for now, just take this line as being the first name STUB */
  48.         /* the at (@) part is supplied to INPOST by the Connectivity */
  49.         /* Manager as the first argument. */
  50.         /* STUB strip off the first thing only */
  51.         temp[0] = '\0';
  52.         p = stptok(¤tLine[6], temp, sizeof(temp), " ");
  53.         if ( strlen(temp) )
  54.             strcpy(MCBStruct.originatingUsername, temp);
  55.         break;
  56.     case CONTENTS:
  57.         /* get the next line; if we have a TExt, FIle, or GRaphic item... */
  58. GetNextMessageLine:
  59.         lineNumber++;
  60.         inTextItem++;
  61.         bytes = GetNextLine();
  62.         if ( bytes == 0 )
  63.             break;
  64.         /* else */
  65.  
  66.         GetFirstWord(firstWord); /* gets the first word of the current line */
  67.  
  68.         ccode = GetCommandType(firstWord);
  69.         if ( ccode != -1 )
  70.             CreateMCBLine(ccode); /* ccode is the switch table index */
  71.         else {
  72.             AddCurrentLineToMessageBuffer();
  73.             goto GetNextMessageLine;
  74.         }
  75.  
  76.         inTextItem = 0;
  77.         break;
  78.     case FORWARDED_BY:
  79.         /* STUB ignore for now */
  80.         break;
  81.     case DATE:
  82.         /* ignore */
  83.         break;
  84.     case TO:
  85.         /* STUB */
  86.         temp[0] = '\0';
  87.         p = stptok(¤tLine[4], temp, sizeof(temp), " ");
  88.         if ( strlen(temp) )
  89.             strcpy(MCBStruct.destinationUsername, temp);
  90.         p += 4;
  91.         if ( *p != '\0' ) /* this shouldn't happen */
  92.             strcpy(MCBStruct.destinationHost, p);
  93.         break;
  94.     case CC:
  95.         /* STUB ignore for now */
  96.         break;
  97.     case SUBJECT:
  98.         if ( strlen(currentLine) > 9 )
  99.             strcpy(MCBStruct.messageSubject, ¤tLine[9]);
  100.         break;
  101.     case TEXT_ITEM:
  102.         GetNextLine();
  103.         goto GetNextMessageLine;
  104.         break;
  105.     case GRAPHICS_ITEM:
  106.         /* STUB - MCB only allows one attachment for now */
  107.         if ( hasAttachment ) break;
  108.         /* strip off the filename part and set this MCB field to that part */
  109.         fileName[0] = '\0';
  110.         p = stptok(¤tLine[15], fileName, sizeof(fileName), " ");
  111.         MCBStruct.contentTypeOfAttachmentFile = 9000;
  112.         goto DoAttachment;
  113.         break;
  114.     case FILE_ITEM:
  115.         /* STUB remember, the MCB format allows us only one attachment file. */
  116.         if ( hasAttachment ) break;
  117.         /* strip off the filename part and set this MCB field to that part */
  118.         fileName[0] = '\0';
  119.         p = stptok(¤tLine[11], fileName, sizeof(fileName), " ");
  120.         MCBStruct.contentTypeOfAttachmentFile = 9000;
  121. DoAttachment:
  122.         hasAttachment++;
  123.         strcpy(MCBStruct.attachmentFilename, fileName);
  124.         /* this will get the number of bytes to copy to the attachment file */
  125.         GetNextLine();
  126.         GetNextLine();
  127.         WriteAttachmentFile(fileName, atoi(currentLine));
  128.         /* open a file by this name in the temp area */
  129.         break;
  130.  
  131.     default:
  132.         ;
  133.     }
  134.  
  135.     return(returnCode);
  136. }
  137.  
  138. void WriteAttachmentFile(fileName, fileSize)
  139. char *fileName;
  140. int fileSize;
  141. {
  142.     int handle, bytesRead, temp = 0;
  143.     char *buffer;
  144.     long fSize;
  145.  
  146.     buffer = (char *)(malloc(30000)); /* allocate statically ? */
  147.  
  148.     if ( buffer == (char *)NULL )
  149.         return;
  150.  
  151.     /* else */
  152.     handle = open(fileName, 0x8301, 0); /* open for write/create */
  153.     if ( handle == -1 ) {
  154.         free(buffer);
  155.         return;
  156.     }
  157.  
  158.     while ( fileSize > 0 ) {
  159.         temp = fileSize < 30000 ? fileSize : 30000;
  160.  
  161.         bytesRead = read(InFile, buffer, temp);
  162.  
  163.         if ( bytesRead )
  164.             write(handle, buffer, bytesRead);
  165.  
  166.         fileSize -= bytesRead;
  167.     }
  168.  
  169.     close(handle);
  170.     free(buffer);
  171. }
  172.